﻿using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace _51_AOP.Utility.Filter
{
    public class CustomResourceFilterAttribute : Attribute, IResourceFilter
    {

        // 1.定义一个缓存区域
        // 2.请求来了，根据缓存的标识--判断缓存如果有缓存，则放回缓存
        // 3.如果没有缓存--做计算
        // 4.把结果保存到缓存中去

        private static Dictionary<string, object> CacheDictonary = new Dictionary<string, object>();

        /// <summary>
        /// 资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            // 如果要执行匿名，就不让这里的代码执行
            {
                // 当前actin所在的控制器所有标记的特性
                if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType().Equals(typeof(CustomAllowAnonymousAttribute))))
                {
                    return;
                }
            }


            Console.WriteLine("CustomResourceFilterAttribute.在资源之后");
            string key = context.HttpContext.Request.Path;
            CacheDictonary[key] = context.Result;


        }
        /// <summary>
        ///  资源之前
        /// </summary>
        /// <param name="context"></param>
        /// <exception cref="NotImplementedException"></exception>

        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // throw new Exception("这个异常我试试");
            // 如果要执行匿名，就不让这里的代码执行
            {
                // 当前actin所在的控制器所有标记的特性
                if (context.ActionDescriptor.EndpointMetadata.Any(c => c.GetType().Equals(typeof(CustomAllowAnonymousAttribute)))) {
                    return;
                }
                
                    
                
            }


            Console.WriteLine("CustomResourceFilterAttribute.在资源之前");
            string key = context.HttpContext.Request.Path; //请求路径
            if (CacheDictonary.ContainsKey(key))
            {
                // 只要给Result赋值了，就会中断往后执行，直接返回给调用方,不执行Action方法
                context.Result = (IActionResult)CacheDictonary[key];
            }

        }
    }
}
